import axios from 'axios'
import { ElMessage } from 'element-plus'
import router from '../router'

// 创建axios实例
const service = axios.create({
  baseURL: '/api', // 使用vite的代理
  timeout: 10000 // 请求超时时间
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 从localStorage中获取token
    const token = localStorage.getItem('token')
    if (token) {
      // 设置请求头
      config.headers['Authorization'] = 'Bearer ' + token
    }

    // 为订单详情请求添加时间戳，避免缓存
    if (config.url && config.url.includes('/orders/') && config.method === 'get') {
      config.params = config.params || {}
      config.params._t = new Date().getTime()
      console.log('为订单详情请求添加时间戳，避免缓存:', config.url)
    }

    // 打印请求信息
    console.log('发送请求:', {
      url: config.url,
      method: config.method,
      params: config.params,
      data: config.data,
      headers: config.headers
    })

    return config
  },
  error => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    const res = response.data

    // 打印响应信息
    console.log('收到响应:', {
      url: response.config.url,
      method: response.config.method,
      status: response.status,
      data: res
    })

    // 特殊处理订单详情接口
    if (response.config.url?.includes('/user/orders/') && response.config.method === 'get') {
      console.log('订单详情接口响应:', res)

      // 检查响应数据结构
      if (res.code === 200 && res.data) {
        console.log('订单详情数据结构检查:', {
          hasOrder: !!res.data.order,
          hasOrderItems: !!res.data.orderItems,
          orderItemsLength: res.data.orderItems ? res.data.orderItems.length : 0
        })
      }
    }

    // 特殊处理商家商品相关接口
    if (response.config.url?.includes('/merchant/products')) {
      console.log('商家商品接口响应:', res)

      // 直接返回原始响应，由组件自行处理
      return res
    }

    // 特殊处理促销活动相关接口
    if (response.config.url?.includes('/merchant/promotions')) {
      console.log('促销活动接口响应:', res)

      // 直接返回原始响应，由组件自行处理
      return res
    }

    // 如果返回的状态码不是200，说明接口请求有误
    if (res.code !== 200) {
      console.error('API请求失败:', {
        url: response.config.url,
        code: res.code,
        message: res.message
      })

      // 对于404错误，不显示错误消息，由组件自行处理
      if (res.code === 404 && response.config.url?.includes('/orders/')) {
        console.warn('订单不存在，不显示错误消息')
        return res
      }

      ElMessage({
        message: res.message || '请求失败',
        type: 'error',
        duration: 5 * 1000
      })

      // 401: 未登录或token过期
      if (res.code === 401) {
        console.warn('用户未登录或token过期，跳转到登录页')
        // 清除token
        localStorage.removeItem('token')
        // 跳转到登录页
        router.replace('/login')
      }

      return Promise.reject(new Error(res.message || '请求失败'))
    } else {
      console.log('API请求成功:', {
        url: response.config.url,
        data: res.data
      })
      return res
    }
  },
  error => {
    console.error('响应错误:', error)

    // 处理HTTP错误状态码
    if (error.response) {
      const status = error.response.status
      const url = error.config?.url || '未知URL'

      console.error(`HTTP错误: ${status}, URL: ${url}`, error.response.data)

      if (status === 401) {
        // 清除token
        localStorage.removeItem('token')
        // 跳转到登录页
        router.replace('/login')
        ElMessage({
          message: '登录已过期，请重新登录',
          type: 'error',
          duration: 5 * 1000
        })
      } else if (status === 404 && url.includes('/orders/')) {
        // 对于订单详情的404错误，不显示错误消息，由组件自行处理
        console.warn('订单不存在(404)，不显示错误消息')
        return Promise.resolve({ code: 404, message: '订单不存在', data: null })
      } else {
        ElMessage({
          message: error.message || '请求失败',
          type: 'error',
          duration: 5 * 1000
        })
      }
    } else {
      ElMessage({
        message: '网络错误，请检查您的网络连接',
        type: 'error',
        duration: 5 * 1000
      })
    }

    return Promise.reject(error)
  }
)

export default service
